#include "widget.h"
#include "ui_widget.h"
#include "mythread.h"
#include <QDebug>
#include <QMessageBox>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);


    for(int i =0;i<threads_num;i++){
       MyThread* tmp = new MyThread;
       tmp->start();
       tmp->setLeader(this);
       tmp->setQueue(&_queue);
       threads.push_back(tmp);
    }

    scanned_model = getModel();
    ui->listView_history->setModel(scanned_model);
    scanding_model = getModel();
    ui->listView_scanding->setModel(scanding_model);


    ui->progressBar->setMaximum(100);
    ui->progressBar->setMinimum(0);
    ui->progressBar->setValue(0);
    connect(this,&Widget::upateData,this,&Widget::setValue);
}

Widget::~Widget()
{

    for(int i=0;i<5;i++){
        threads[i]->setClose();
    }
    MyThread::threadWakeAll();
    for(int i=0;i<5;i++){
        threads[i]->wait();
        delete threads[i];
    }
    delete ui;
}

void Widget::mapInsert(QString &name, MyThread *ptr)
{
    _map.insert(name,ptr);
}

QTableView *Widget::getTableView()
{
    return ui->tableView;
}

QStandardItemModel *Widget::getScandingmodel()
{
    return scanding_model;
}

QStandardItemModel *Widget::getScannedmodel()
{
    return scanned_model;
}

void Widget::scandedInsert(QString &name, QStandardItemModel* model)
{
    scanned_dir.insert(name,model);
}

void Widget::scandingInsert(QString &name, QStandardItemModel* model)
{
    scanding_dir.insert(name,model);
}

void Widget::scanding_remove(QString &name)
{
    scanding_dir.remove(name);
}

void Widget::setWarningQmessage(const QString &text)
{
    QMessageBox* msg = new QMessageBox(this);
    msg->setWindowTitle("Warning");
    msg->setIcon(QMessageBox::Warning);
    msg->setText(text);
    msg->setStandardButtons(QMessageBox::Yes | QMessageBox::No);
    msg->setAttribute(Qt::WA_DeleteOnClose);
    msg->show();

}

void Widget::setQuestionQmessage(const QString &text)
{
   QMessageBox* msg = new QMessageBox(this);
   msg->setWindowTitle("Question");
   msg->setIcon(QMessageBox::Question);
   msg->setText(text);
   msg->setStandardButtons(QMessageBox::Yes | QMessageBox::No);
   msg->setAttribute(Qt::WA_DeleteOnClose);
   msg->show();

}

QStandardItemModel *Widget::getModel()
{
    // 创建模型：0行1列
    QStandardItemModel *model = new QStandardItemModel(0, 1,this); // 参数：行数(0)，列数(1)

    // 设置水平表头（仅1列）
    model->setHorizontalHeaderLabels(QStringList() << "文件名称");
    return model;
}

int Widget::modelAddData(QStandardItemModel* model, QString &dirname)
{
    QList<QStandardItem*> rowItems;
    rowItems << new QStandardItem(dirname);
    // 在末尾添加一行
    model->appendRow(rowItems);
    return model->rowCount()-1;
}

void Widget::modelRemoveData(QStandardItemModel* model,int targetrow)
{
    // 获取当前选中的行（单选）
    QModelIndex currentIndex = ui->listView_scanding->currentIndex();
    if (currentIndex.isValid()) {
        targetrow = currentIndex.row();
    }
    if (targetrow >= 0 && targetrow < model->rowCount()) {
        model->removeRow(targetrow);
    }
}
//按下暂停按钮，就停止扫描，再按就开始
void Widget::on_pushButton_stop_clicked()
{
    //我们这里的文件扫描是很快的，如果不用sleep来延缓，几乎就是一瞬间的事情
    //因为很快，所以基本上这个暂停按钮是没有任何作用的
    //1.安全检查
    QString dirname = ui->lineEdit->text();
    //如果输入框为空，或者指定的文件夹已经完成了扫描，则直接返回
    if(dirname.isEmpty() || findDir(scanned_dir,dirname)){
        setQuestionQmessage("指定的文件夹为空或者已经完成扫描，请重新输入");
        return ;
    }
    //2.暂停扫描，
    //没有扫描完，就需要暂停扫描了，将对应线程中的_stop设置一下
    MyThread* ptr = _map[dirname];
    ptr->setStop();
    //3.设置文本信息
    QString tmptext = ui->pushButton_stop->text();
    if(tmptext == "暂停扫描")ui->pushButton_stop->setText("继续扫描");
    else ui->pushButton_stop->setText("暂停扫描");

}

void Widget::setValue(int value)
{
    ui->progressBar->setValue(value);
}
//按下扫描按钮，从单行输入框中获取目标文件夹，开始扫描
void Widget::on_pushButton_start_clicked()
{
    QString dirname = ui->lineEdit->text();
    //判断是否是目录
    //1.不是目录直接返回
    QFileInfo file(dirname);
    if(file.isDir()==false){
        setQuestionQmessage("你当前扫描的文件并不是一个文件夹，请重新指定!");
        return ;
    }
    //2.是目录则进行扫描
    //2.1判断该文件夹是否正在被扫描
    //被扫描过，则直接返回
    if(findDir(scanding_dir,dirname)){
        setQuestionQmessage("该文件夹正在被扫描，无需重复扫描.");
        return ;
    }
    //没有被扫描过
    int oldsize = scanding_dir.size();
    if(oldsize == 5){
        setWarningQmessage("当前正在扫描的文件夹数量达到最大数量,请先扫描旧文件，再添加!");
        return ;
    }
    ui->label_4->setText(dirname+":");
    ui->progressBar->setValue(0);
    _queue.push_back(dirname);

    //唤醒一个线程
    MyThread::threadWakeOne();
    //因为主线程与创建的线程是同步的
    //有可能主线程比较快，所以主线程需要等创建的线程开始扫描后，才能继续下一步
    //这里用一个while循环来模拟等待
    while(scanding_dir.size()!= oldsize+1);

}

bool Widget::findDir(QMap<QString,QStandardItemModel*>&tmp,QString &name)
{
    if (tmp.contains(name)) {
            return true;
        } else {
            return false;
        }
        return 0;
}
//双击正在扫描的表单项时触发
void Widget::on_listView_scanding_doubleClicked(const QModelIndex &index)
{
    (void)index;
    // 通过 currentIndex() 获取（单选）
    QModelIndex currentIndex = ui->listView_scanding->currentIndex();
    if (currentIndex.isValid()) {
       change_dirname = currentIndex.data(Qt::DisplayRole).toString();
    }else{
        return ;
    }
    if(change_dirname == ui->lineEdit->text()){
        setQuestionQmessage("当前选择的文件夹就是正在被扫描的文件,无效操作");
        return ;
    }
    //选中后，弹出对话框，询问是否切换当前被扫描的文件夹
    msgBox.setText("是否切换当前文件夹");
    msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
    connect(&msgBox, &QMessageBox::buttonClicked, this, &Widget::handleButtonClick);
    msgBox.show();
    // 连接信号与槽
}

void Widget::handleButtonClick(QAbstractButton *button) {
    msgBox.close();
    if (button == msgBox.button(QMessageBox::Yes)) {
        qDebug() << "用户确认切换文件夹";
        //开始切换
        //1.切换输入框中的内容
        ui->lineEdit->setText(change_dirname);
        //2.切换tableview中显示的模型
        ui->tableView->setModel(scanding_dir[change_dirname]);
        //3.设置暂停按钮的文本信息
        ui->pushButton_stop->setText("继续扫描");
        //4，设置进度条labe
        ui->label_4->setText(change_dirname+":");
        qDebug()<<"执行完";
    } else if (button == msgBox.button(QMessageBox::No)) {
        qDebug() << "用户取消操作";
        //直接退出
        return ;
    }
}



void Widget::on_lineEdit_textEdited(const QString &arg1)
{
    (void)arg1;
    ui->progressBar->setValue(0);
}

void Widget::on_lineEdit_editingFinished()
{
    QString filename = ui->lineEdit->text();
    if(findDir(scanned_dir,filename)){
        setQuestionQmessage("该文件夹已经被扫描过了，请重新添加!");
        ui->progressBar->setValue(100);
        return ;
    }

}
